// Copyright (c) Alexandre Mutel. All rights reserved.
// This file is licensed under the BSD-Clause 2 license. 
// See the license.txt file in the project root for more information.

using System.Collections.Generic;
using Markdig.Helpers;

namespace Markdig.Extensions.Emoji
{
    /// <summary>
    /// An emoji shortcodes and smileys mapping, to be used by <see cref="EmojiParser"/>.
    /// </summary>
    public class EmojiMapping
    {
        /// <summary>
        /// The default emoji shortcodes and smileys mapping.
        /// </summary>
        public static readonly EmojiMapping DefaultEmojisAndSmileysMapping = new EmojiMapping();

        /// <summary>
        /// The default emoji shortcodes mapping, without smileys.
        /// </summary>
        public static readonly EmojiMapping DefaultEmojisOnlyMapping = new EmojiMapping(enableSmileys: false);

        internal CompactPrefixTree<string> PrefixTree { get; }

        internal char[] OpeningCharacters { get; }

        #region Emojis and Smileys

        /// <summary>
        /// Returns a new instance of the default emoji shortcode to emoji unicode dictionary.
        /// It can be used to create a customized <see cref="EmojiMapping"/>.
        /// </summary>
        public static IDictionary<string, string> GetDefaultEmojiShortcodeToUnicode()
        {
            return new Dictionary<string, string>(1603)
            {
                {":100:", "💯"},
                {":1234:", "🔢"},
                {":smile:", "😄"},
                {":smiley:", "😃"},
                {":grinning:", "😀"},
                {":blush:", "😊"},
                {":relaxed:", "☺️"},
                {":wink:", "😉"},
                {":heart_eyes:", "😍"},
                {":kissing_heart:", "😘"},
                {":kissing_closed_eyes:", "😚"},
                {":kissing:", "😗"},
                {":kissing_smiling_eyes:", "😙"},
                {":stuck_out_tongue_winking_eye:", "😜"},
                {":stuck_out_tongue_closed_eyes:", "😝"},
                {":stuck_out_tongue:", "😛"},
                {":flushed:", "😳"},
                {":grin:", "😁"},
                {":pensive:", "😔"},
                {":relieved:", "😌"},
                {":unamused:", "😒"},
                {":disappointed:", "😞"},
                {":persevere:", "😣"},
                {":cry:", "😢"},
                {":joy:", "😂"},
                {":sob:", "😭"},
                {":sleepy:", "😪"},
                {":disappointed_relieved:", "😥"},
                {":cold_sweat:", "😰"},
                {":sweat_smile:", "😅"},
                {":sweat:", "😓"},
                {":weary:", "😩"},
                {":tired_face:", "😫"},
                {":fearful:", "😨"},
                {":scream:", "😱"},
                {":angry:", "😠"},
                {":rage:", "😡"},
                {":triumph:", "😤"},
                {":confounded:", "😖"},
                {":laughing:", "😆"},
                {":satisfied:", "😆"},
                {":yum:", "😋"},
                {":mask:", "😷"},
                {":sunglasses:", "😎"},
                {":sleeping:", "😴"},
                {":dizzy_face:", "😵"},
                {":astonished:", "😲"},
                {":worried:", "😟"},
                {":frowning:", "😦"},
                {":anguished:", "😧"},
                {":smiling_imp:", "😈"},
                {":imp:", "👿"},
                {":open_mouth:", "😮"},
                {":grimacing:", "😬"},
                {":neutral_face:", "😐"},
                {":confused:", "😕"},
                {":hushed:", "😯"},
                {":no_mouth:", "😶"},
                {":innocent:", "😇"},
                {":smirk:", "😏"},
                {":expressionless:", "😑"},
                {":man_with_gua_pi_mao:", "👲"},
                {":man_with_turban:", "👳"},
                {":cop:", "👮"},
                {":construction_worker:", "👷"},
                {":guardsman:", "💂"},
                {":baby:", "👶"},
                {":boy:", "👦"},
                {":girl:", "👧"},
                {":man:", "👨"},
                {":woman:", "👩"},
                {":older_man:", "👴"},
                {":older_woman:", "👵"},
                {":person_with_blond_hair:", "👱"},
                {":angel:", "👼"},
                {":princess:", "👸"},
                {":smiley_cat:", "😺"},
                {":smile_cat:", "😸"},
                {":heart_eyes_cat:", "😻"},
                {":kissing_cat:", "😽"},
                {":smirk_cat:", "😼"},
                {":scream_cat:", "🙀"},
                {":crying_cat_face:", "😿"},
                {":joy_cat:", "😹"},
                {":pouting_cat:", "😾"},
                {":japanese_ogre:", "👹"},
                {":japanese_goblin:", "👺"},
                {":see_no_evil:", "🙈"},
                {":hear_no_evil:", "🙉"},
                {":speak_no_evil:", "🙊"},
                {":skull:", "💀"},
                {":alien:", "👽"},
                {":hankey:", "💩"},
                {":poop:", "💩"},
                {":shit:", "💩"},
                {":fire:", "🔥"},
                {":sparkles:", "✨"},
                {":star2:", "🌟"},
                {":dizzy:", "💫"},
                {":boom:", "💥"},
                {":collision:", "💥"},
                {":anger:", "💢"},
                {":sweat_drops:", "💦"},
                {":droplet:", "💧"},
                {":zzz:", "💤"},
                {":dash:", "💨"},
                {":ear:", "👂"},
                {":eyes:", "👀"},
                {":nose:", "👃"},
                {":tongue:", "👅"},
                {":lips:", "👄"},
                {":+1:", "👍"},
                {":thumbsup:", "👍"},
                {":-1:", "👎"},
                {":thumbsdown:", "👎"},
                {":ok_hand:", "👌"},
                {":facepunch:", "👊"},
                {":punch:", "👊"},
                {":fist:", "✊"},
                {":v:", "✌️"},
                {":wave:", "👋"},
                {":hand:", "✋"},
                {":raised_hand:", "✋"},
                {":open_hands:", "👐"},
                {":point_up_2:", "👆"},
                {":point_down:", "👇"},
                {":point_right:", "👉"},
                {":point_left:", "👈"},
                {":raised_hands:", "🙌"},
                {":pray:", "🙏"},
                {":point_up:", "☝️"},
                {":clap:", "👏"},
                {":muscle:", "💪"},
                {":walking:", "🚶"},
                {":runner:", "🏃"},
                {":running:", "🏃"},
                {":dancer:", "💃"},
                {":couple:", "👫"},
                {":family:", "👪"},
                {":two_men_holding_hands:", "👬"},
                {":two_women_holding_hands:", "👭"},
                {":couplekiss:", "💏"},
                {":couple_with_heart:", "💑"},
                {":dancers:", "👯"},
                {":ok_woman:", "🙆"},
                {":no_good:", "🙅"},
                {":information_desk_person:", "💁"},
                {":raising_hand:", "🙋"},
                {":massage:", "💆"},
                {":haircut:", "💇"},
                {":nail_care:", "💅"},
                {":bride_with_veil:", "👰"},
                {":person_with_pouting_face:", "🙎"},
                {":person_frowning:", "🙍"},
                {":bow:", "🙇"},
                {":tophat:", "🎩"},
                {":crown:", "👑"},
                {":womans_hat:", "👒"},
                {":athletic_shoe:", "👟"},
                {":mans_shoe:", "👞"},
                {":shoe:", "👞"},
                {":sandal:", "👡"},
                {":high_heel:", "👠"},
                {":boot:", "👢"},
                {":shirt:", "👕"},
                {":tshirt:", "👕"},
                {":necktie:", "👔"},
                {":womans_clothes:", "👚"},
                {":dress:", "👗"},
                {":running_shirt_with_sash:", "🎽"},
                {":jeans:", "👖"},
                {":kimono:", "👘"},
                {":bikini:", "👙"},
                {":briefcase:", "💼"},
                {":handbag:", "👜"},
                {":pouch:", "👝"},
                {":purse:", "👛"},
                {":eyeglasses:", "👓"},
                {":ribbon:", "🎀"},
                {":closed_umbrella:", "🌂"},
                {":lipstick:", "💄"},
                {":yellow_heart:", "💛"},
                {":blue_heart:", "💙"},
                {":purple_heart:", "💜"},
                {":green_heart:", "💚"},
                {":heart:", "❤️"},
                {":broken_heart:", "💔"},
                {":heartpulse:", "💗"},
                {":heartbeat:", "💓"},
                {":two_hearts:", "💕"},
                {":sparkling_heart:", "💖"},
                {":revolving_hearts:", "💞"},
                {":cupid:", "💘"},
                {":love_letter:", "💌"},
                {":kiss:", "💋"},
                {":ring:", "💍"},
                {":gem:", "💎"},
                {":bust_in_silhouette:", "👤"},
                {":busts_in_silhouette:", "👥"},
                {":speech_balloon:", "💬"},
                {":footprints:", "👣"},
                {":thought_balloon:", "💭"},
                {":dog:", "🐶"},
                {":wolf:", "🐺"},
                {":cat:", "🐱"},
                {":mouse:", "🐭"},
                {":hamster:", "🐹"},
                {":rabbit:", "🐰"},
                {":frog:", "🐸"},
                {":tiger:", "🐯"},
                {":koala:", "🐨"},
                {":bear:", "🐻"},
                {":pig:", "🐷"},
                {":pig_nose:", "🐽"},
                {":cow:", "🐮"},
                {":boar:", "🐗"},
                {":monkey_face:", "🐵"},
                {":monkey:", "🐒"},
                {":horse:", "🐴"},
                {":sheep:", "🐑"},
                {":elephant:", "🐘"},
                {":panda_face:", "🐼"},
                {":penguin:", "🐧"},
                {":bird:", "🐦"},
                {":baby_chick:", "🐤"},
                {":hatched_chick:", "🐥"},
                {":hatching_chick:", "🐣"},
                {":chicken:", "🐔"},
                {":snake:", "🐍"},
                {":turtle:", "🐢"},
                {":bug:", "🐛"},
                {":bee:", "🐝"},
                {":honeybee:", "🐝"},
                {":ant:", "🐜"},
                {":beetle:", "🐞"},
                {":snail:", "🐌"},
                {":octopus:", "🐙"},
                {":shell:", "🐚"},
                {":tropical_fish:", "🐠"},
                {":fish:", "🐟"},
                {":dolphin:", "🐬"},
                {":flipper:", "🐬"},
                {":whale:", "🐳"},
                {":whale2:", "🐋"},
                {":cow2:", "🐄"},
                {":ram:", "🐏"},
                {":rat:", "🐀"},
                {":water_buffalo:", "🐃"},
                {":tiger2:", "🐅"},
                {":rabbit2:", "🐇"},
                {":dragon:", "🐉"},
                {":racehorse:", "🐎"},
                {":goat:", "🐐"},
                {":rooster:", "🐓"},
                {":dog2:", "🐕"},
                {":pig2:", "🐖"},
                {":mouse2:", "🐁"},
                {":ox:", "🐂"},
                {":dragon_face:", "🐲"},
                {":blowfish:", "🐡"},
                {":crocodile:", "🐊"},
                {":camel:", "🐫"},
                {":dromedary_camel:", "🐪"},
                {":leopard:", "🐆"},
                {":cat2:", "🐈"},
                {":poodle:", "🐩"},
                {":feet:", "🐾"},
                {":paw_prints:", "🐾"},
                {":bouquet:", "💐"},
                {":cherry_blossom:", "🌸"},
                {":tulip:", "🌷"},
                {":four_leaf_clover:", "🍀"},
                {":rose:", "🌹"},
                {":sunflower:", "🌻"},
                {":hibiscus:", "🌺"},
                {":maple_leaf:", "🍁"},
                {":leaves:", "🍃"},
                {":fallen_leaf:", "🍂"},
                {":herb:", "🌿"},
                {":ear_of_rice:", "🌾"},
                {":mushroom:", "🍄"},
                {":cactus:", "🌵"},
                {":palm_tree:", "🌴"},
                {":evergreen_tree:", "🌲"},
                {":deciduous_tree:", "🌳"},
                {":chestnut:", "🌰"},
                {":seedling:", "🌱"},
                {":blossom:", "🌼"},
                {":globe_with_meridians:", "🌐"},
                {":sun_with_face:", "🌞"},
                {":full_moon_with_face:", "🌝"},
                {":new_moon_with_face:", "🌚"},
                {":new_moon:", "🌑"},
                {":waxing_crescent_moon:", "🌒"},
                {":first_quarter_moon:", "🌓"},
                {":moon:", "🌔"},
                {":waxing_gibbous_moon:", "🌔"},
                {":full_moon:", "🌕"},
                {":waning_gibbous_moon:", "🌖"},
                {":last_quarter_moon:", "🌗"},
                {":waning_crescent_moon:", "🌘"},
                {":last_quarter_moon_with_face:", "🌜"},
                {":first_quarter_moon_with_face:", "🌛"},
                {":crescent_moon:", "🌙"},
                {":earth_africa:", "🌍"},
                {":earth_americas:", "🌎"},
                {":earth_asia:", "🌏"},
                {":volcano:", "🌋"},
                {":milky_way:", "🌌"},
                {":stars:", "🌠"},
                {":star:", "⭐"},
                {":sunny:", "☀️"},
                {":partly_sunny:", "⛅"},
                {":cloud:", "☁️"},
                {":zap:", "⚡"},
                {":umbrella:", "☔"},
                {":snowflake:", "❄️"},
                {":snowman:", "⛄"},
                {":cyclone:", "🌀"},
                {":foggy:", "🌁"},
                {":rainbow:", "🌈"},
                {":ocean:", "🌊"},
                {":bamboo:", "🎍"},
                {":gift_heart:", "💝"},
                {":dolls:", "🎎"},
                {":school_satchel:", "🎒"},
                {":mortar_board:", "🎓"},
                {":flags:", "🎏"},
                {":fireworks:", "🎆"},
                {":sparkler:", "🎇"},
                {":wind_chime:", "🎐"},
                {":rice_scene:", "🎑"},
                {":jack_o_lantern:", "🎃"},
                {":ghost:", "👻"},
                {":santa:", "🎅"},
                {":christmas_tree:", "🎄"},
                {":gift:", "🎁"},
                {":tanabata_tree:", "🎋"},
                {":tada:", "🎉"},
                {":confetti_ball:", "🎊"},
                {":balloon:", "🎈"},
                {":crossed_flags:", "🎌"},
                {":crystal_ball:", "🔮"},
                {":movie_camera:", "🎥"},
                {":camera:", "📷"},
                {":video_camera:", "📹"},
                {":vhs:", "📼"},
                {":cd:", "💿"},
                {":dvd:", "📀"},
                {":minidisc:", "💽"},
                {":floppy_disk:", "💾"},
                {":computer:", "💻"},
                {":iphone:", "📱"},
                {":phone:", "☎️"},
                {":telephone:", "☎️"},
                {":telephone_receiver:", "📞"},
                {":pager:", "📟"},
                {":fax:", "📠"},
                {":satellite:", "📡"},
                {":tv:", "📺"},
                {":radio:", "📻"},
                {":loud_sound:", "🔊"},
                {":sound:", "🔉"},
                {":speaker:", "🔈"},
                {":mute:", "🔇"},
                {":bell:", "🔔"},
                {":no_bell:", "🔕"},
                {":loudspeaker:", "📢"},
                {":mega:", "📣"},
                {":hourglass_flowing_sand:", "⏳"},
                {":hourglass:", "⌛"},
                {":alarm_clock:", "⏰"},
                {":watch:", "⌚"},
                {":unlock:", "🔓"},
                {":lock:", "🔒"},
                {":lock_with_ink_pen:", "🔏"},
                {":closed_lock_with_key:", "🔐"},
                {":key:", "🔑"},
                {":mag_right:", "🔎"},
                {":bulb:", "💡"},
                {":flashlight:", "🔦"},
                {":high_brightness:", "🔆"},
                {":low_brightness:", "🔅"},
                {":electric_plug:", "🔌"},
                {":battery:", "🔋"},
                {":mag:", "🔍"},
                {":bathtub:", "🛁"},
                {":bath:", "🛀"},
                {":shower:", "🚿"},
                {":toilet:", "🚽"},
                {":wrench:", "🔧"},
                {":nut_and_bolt:", "🔩"},
                {":hammer:", "🔨"},
                {":door:", "🚪"},
                {":smoking:", "🚬"},
                {":bomb:", "💣"},
                {":gun:", "🔫"},
                {":hocho:", "🔪"},
                {":knife:", "🔪"},
                {":pill:", "💊"},
                {":syringe:", "💉"},
                {":moneybag:", "💰"},
                {":yen:", "💴"},
                {":dollar:", "💵"},
                {":pound:", "💷"},
                {":euro:", "💶"},
                {":credit_card:", "💳"},
                {":money_with_wings:", "💸"},
                {":calling:", "📲"},
                {":e-mail:", "📧"},
                {":inbox_tray:", "📥"},
                {":outbox_tray:", "📤"},
                {":email:", "✉️"},
                {":envelope:", "✉️"},
                {":envelope_with_arrow:", "📩"},
                {":incoming_envelope:", "📨"},
                {":postal_horn:", "📯"},
                {":mailbox:", "📫"},
                {":mailbox_closed:", "📪"},
                {":mailbox_with_mail:", "📬"},
                {":mailbox_with_no_mail:", "📭"},
                {":postbox:", "📮"},
                {":package:", "📦"},
                {":memo:", "📝"},
                {":pencil:", "📝"},
                {":page_facing_up:", "📄"},
                {":page_with_curl:", "📃"},
                {":bookmark_tabs:", "📑"},
                {":bar_chart:", "📊"},
                {":chart_with_upwards_trend:", "📈"},
                {":chart_with_downwards_trend:", "📉"},
                {":scroll:", "📜"},
                {":clipboard:", "📋"},
                {":date:", "📅"},
                {":calendar:", "📆"},
                {":card_index:", "📇"},
                {":file_folder:", "📁"},
                {":open_file_folder:", "📂"},
                {":scissors:", "✂️"},
                {":pushpin:", "📌"},
                {":paperclip:", "📎"},
                {":black_nib:", "✒️"},
                {":pencil2:", "✏️"},
                {":straight_ruler:", "📏"},
                {":triangular_ruler:", "📐"},
                {":closed_book:", "📕"},
                {":green_book:", "📗"},
                {":blue_book:", "📘"},
                {":orange_book:", "📙"},
                {":notebook:", "📓"},
                {":notebook_with_decorative_cover:", "📔"},
                {":ledger:", "📒"},
                {":books:", "📚"},
                {":book:", "📖"},
                {":open_book:", "📖"},
                {":bookmark:", "🔖"},
                {":name_badge:", "📛"},
                {":microscope:", "🔬"},
                {":telescope:", "🔭"},
                {":newspaper:", "📰"},
                {":art:", "🎨"},
                {":clapper:", "🎬"},
                {":microphone:", "🎤"},
                {":headphones:", "🎧"},
                {":musical_score:", "🎼"},
                {":musical_note:", "🎵"},
                {":notes:", "🎶"},
                {":musical_keyboard:", "🎹"},
                {":violin:", "🎻"},
                {":trumpet:", "🎺"},
                {":saxophone:", "🎷"},
                {":guitar:", "🎸"},
                {":space_invader:", "👾"},
                {":video_game:", "🎮"},
                {":black_joker:", "🃏"},
                {":flower_playing_cards:", "🎴"},
                {":mahjong:", "🀄"},
                {":game_die:", "🎲"},
                {":dart:", "🎯"},
                {":football:", "🏈"},
                {":basketball:", "🏀"},
                {":soccer:", "⚽"},
                {":baseball:", "⚾️"},
                {":tennis:", "🎾"},
                {":8ball:", "🎱"},
                {":rugby_football:", "🏉"},
                {":bowling:", "🎳"},
                {":golf:", "⛳"},
                {":mountain_bicyclist:", "🚵"},
                {":bicyclist:", "🚴"},
                {":checkered_flag:", "🏁"},
                {":horse_racing:", "🏇"},
                {":trophy:", "🏆"},
                {":ski:", "🎿"},
                {":snowboarder:", "🏂"},
                {":swimmer:", "🏊"},
                {":surfer:", "🏄"},
                {":fishing_pole_and_fish:", "🎣"},
                {":coffee:", "☕"},
                {":tea:", "🍵"},
                {":sake:", "🍶"},
                {":baby_bottle:", "🍼"},
                {":beer:", "🍺"},
                {":beers:", "🍻"},
                {":cocktail:", "🍸"},
                {":tropical_drink:", "🍹"},
                {":wine_glass:", "🍷"},
                {":fork_and_knife:", "🍴"},
                {":pizza:", "🍕"},
                {":hamburger:", "🍔"},
                {":fries:", "🍟"},
                {":poultry_leg:", "🍗"},
                {":meat_on_bone:", "🍖"},
                {":spaghetti:", "🍝"},
                {":curry:", "🍛"},
                {":fried_shrimp:", "🍤"},
                {":bento:", "🍱"},
                {":sushi:", "🍣"},
                {":fish_cake:", "🍥"},
                {":rice_ball:", "🍙"},
                {":rice_cracker:", "🍘"},
                {":rice:", "🍚"},
                {":ramen:", "🍜"},
                {":stew:", "🍲"},
                {":oden:", "🍢"},
                {":dango:", "🍡"},
                {":egg:", "🍳"},
                {":bread:", "🍞"},
                {":doughnut:", "🍩"},
                {":custard:", "🍮"},
                {":icecream:", "🍦"},
                {":ice_cream:", "🍨"},
                {":shaved_ice:", "🍧"},
                {":birthday:", "🎂"},
                {":cake:", "🍰"},
                {":cookie:", "🍪"},
                {":chocolate_bar:", "🍫"},
                {":candy:", "🍬"},
                {":lollipop:", "🍭"},
                {":honey_pot:", "🍯"},
                {":apple:", "🍎"},
                {":green_apple:", "🍏"},
                {":tangerine:", "🍊"},
                {":lemon:", "🍋"},
                {":cherries:", "🍒"},
                {":grapes:", "🍇"},
                {":watermelon:", "🍉"},
                {":strawberry:", "🍓"},
                {":peach:", "🍑"},
                {":melon:", "🍈"},
                {":banana:", "🍌"},
                {":pear:", "🍐"},
                {":pineapple:", "🍍"},
                {":sweet_potato:", "🍠"},
                {":eggplant:", "🍆"},
                {":tomato:", "🍅"},
                {":corn:", "🌽"},
                {":house:", "🏠"},
                {":house_with_garden:", "🏡"},
                {":school:", "🏫"},
                {":office:", "🏢"},
                {":post_office:", "🏣"},
                {":hospital:", "🏥"},
                {":bank:", "🏦"},
                {":convenience_store:", "🏪"},
                {":love_hotel:", "🏩"},
                {":hotel:", "🏨"},
                {":wedding:", "💒"},
                {":church:", "⛪"},
                {":department_store:", "🏬"},
                {":european_post_office:", "🏤"},
                {":city_sunrise:", "🌇"},
                {":city_sunset:", "🌆"},
                {":japanese_castle:", "🏯"},
                {":european_castle:", "🏰"},
                {":tent:", "⛺"},
                {":factory:", "🏭"},
                {":tokyo_tower:", "🗼"},
                {":japan:", "🗾"},
                {":mount_fuji:", "🗻"},
                {":sunrise_over_mountains:", "🌄"},
                {":sunrise:", "🌅"},
                {":night_with_stars:", "🌃"},
                {":statue_of_liberty:", "🗽"},
                {":bridge_at_night:", "🌉"},
                {":carousel_horse:", "🎠"},
                {":ferris_wheel:", "🎡"},
                {":fountain:", "⛲"},
                {":roller_coaster:", "🎢"},
                {":ship:", "🚢"},
                {":boat:", "⛵"},
                {":sailboat:", "⛵"},
                {":speedboat:", "🚤"},
                {":rowboat:", "🚣"},
                {":anchor:", "⚓"},
                {":rocket:", "🚀"},
                {":airplane:", "✈️"},
                {":seat:", "💺"},
                {":helicopter:", "🚁"},
                {":steam_locomotive:", "🚂"},
                {":tram:", "🚊"},
                {":station:", "🚉"},
                {":mountain_railway:", "🚞"},
                {":train2:", "🚆"},
                {":bullettrain_side:", "🚄"},
                {":bullettrain_front:", "🚅"},
                {":light_rail:", "🚈"},
                {":metro:", "🚇"},
                {":monorail:", "🚝"},
                {":train:", "🚋"},
                {":railway_car:", "🚃"},
                {":trolleybus:", "🚎"},
                {":bus:", "🚌"},
                {":oncoming_bus:", "🚍"},
                {":blue_car:", "🚙"},
                {":oncoming_automobile:", "🚘"},
                {":car:", "🚗"},
                {":red_car:", "🚗"},
                {":taxi:", "🚕"},
                {":oncoming_taxi:", "🚖"},
                {":articulated_lorry:", "🚛"},
                {":truck:", "🚚"},
                {":rotating_light:", "🚨"},
                {":police_car:", "🚓"},
                {":oncoming_police_car:", "🚔"},
                {":fire_engine:", "🚒"},
                {":ambulance:", "🚑"},
                {":minibus:", "🚐"},
                {":bike:", "🚲"},
                {":aerial_tramway:", "🚡"},
                {":suspension_railway:", "🚟"},
                {":mountain_cableway:", "🚠"},
                {":tractor:", "🚜"},
                {":barber:", "💈"},
                {":busstop:", "🚏"},
                {":ticket:", "🎫"},
                {":vertical_traffic_light:", "🚦"},
                {":traffic_light:", "🚥"},
                {":warning:", "⚠️"},
                {":construction:", "🚧"},
                {":beginner:", "🔰"},
                {":fuelpump:", "⛽"},
                {":izakaya_lantern:", "🏮"},
                {":lantern:", "🏮"},
                {":slot_machine:", "🎰"},
                {":hotsprings:", "♨️"},
                {":moyai:", "🗿"},
                {":circus_tent:", "🎪"},
                {":performing_arts:", "🎭"},
                {":round_pushpin:", "📍"},
                {":triangular_flag_on_post:", "🚩"},
                {":jp:", "🇯🇵"},
                {":kr:", "🇰🇷"},
                {":de:", "🇩🇪"},
                {":cn:", "🇨🇳"},
                {":us:", "🇺🇸"},
                {":fr:", "🇫🇷"},
                {":es:", "🇪🇸"},
                {":it:", "🇮🇹"},
                {":ru:", "🇷🇺"},
                {":gb:", "🇬🇧"},
                {":uk:", "🇬🇧"},
                {":one:", "1️⃣"},
                {":two:", "2️⃣"},
                {":three:", "3️⃣"},
                {":four:", "4️⃣"},
                {":five:", "5️⃣"},
                {":six:", "6️⃣"},
                {":seven:", "7️⃣"},
                {":eight:", "8️⃣"},
                {":nine:", "9️⃣"},
                {":zero:", "0️⃣"},
                {":keycap_ten:", "🔟"},
                {":hash:", "#️⃣"},
                {":symbols:", "🔣"},
                {":arrow_up:", "⬆️"},
                {":arrow_down:", "⬇️"},
                {":arrow_left:", "⬅️"},
                {":arrow_right:", "➡️"},
                {":capital_abcd:", "🔠"},
                {":abcd:", "🔡"},
                {":abc:", "🔤"},
                {":arrow_upper_right:", "↗️"},
                {":arrow_upper_left:", "↖️"},
                {":arrow_lower_right:", "↘️"},
                {":arrow_lower_left:", "↙️"},
                {":left_right_arrow:", "↔️"},
                {":arrow_up_down:", "↕️"},
                {":arrows_counterclockwise:", "🔄"},
                {":arrow_backward:", "◀️"},
                {":arrow_forward:", "▶️"},
                {":arrow_up_small:", "🔼"},
                {":arrow_down_small:", "🔽"},
                {":leftwards_arrow_with_hook:", "↩️"},
                {":arrow_right_hook:", "↪️"},
                {":information_source:", "ℹ️"},
                {":rewind:", "⏪"},
                {":fast_forward:", "⏩"},
                {":arrow_double_up:", "⏫"},
                {":arrow_double_down:", "⏬"},
                {":arrow_heading_down:", "⤵️"},
                {":arrow_heading_up:", "⤴️"},
                {":ok:", "🆗"},
                {":twisted_rightwards_arrows:", "🔀"},
                {":repeat:", "🔁"},
                {":repeat_one:", "🔂"},
                {":new:", "🆕"},
                {":up:", "🆙"},
                {":cool:", "🆒"},
                {":free:", "🆓"},
                {":ng:", "🆖"},
                {":signal_strength:", "📶"},
                {":cinema:", "🎦"},
                {":koko:", "🈁"},
                {":u6307:", "🈯"},
                {":u7a7a:", "🈳"},
                {":u6e80:", "🈵"},
                {":u5408:", "🈴"},
                {":u7981:", "🈲"},
                {":ideograph_advantage:", "🉐"},
                {":u5272:", "🈹"},
                {":u55b6:", "🈺"},
                {":u6709:", "🈶"},
                {":u7121:", "🈚"},
                {":restroom:", "🚻"},
                {":mens:", "🚹"},
                {":womens:", "🚺"},
                {":baby_symbol:", "🚼"},
                {":wc:", "🚾"},
                {":potable_water:", "🚰"},
                {":put_litter_in_its_place:", "🚮"},
                {":parking:", "🅿️"},
                {":wheelchair:", "♿"},
                {":no_smoking:", "🚭"},
                {":u6708:", "🈷️"},
                {":u7533:", "🈸"},
                {":sa:", "🈂️"},
                {":m:", "Ⓜ️"},
                {":passport_control:", "🛂"},
                {":baggage_claim:", "🛄"},
                {":left_luggage:", "🛅"},
                {":customs:", "🛃"},
                {":accept:", "🉑"},
                {":secret:", "㊙️"},
                {":congratulations:", "㊗️"},
                {":cl:", "🆑"},
                {":sos:", "🆘"},
                {":id:", "🆔"},
                {":no_entry_sign:", "🚫"},
                {":underage:", "🔞"},
                {":no_mobile_phones:", "📵"},
                {":do_not_litter:", "🚯"},
                {":non-potable_water:", "🚱"},
                {":no_bicycles:", "🚳"},
                {":no_pedestrians:", "🚷"},
                {":children_crossing:", "🚸"},
                {":no_entry:", "⛔"},
                {":eight_spoked_asterisk:", "✳️"},
                {":sparkle:", "❇️"},
                {":negative_squared_cross_mark:", "❎"},
                {":white_check_mark:", "✅"},
                {":eight_pointed_black_star:", "✴️"},
                {":heart_decoration:", "💟"},
                {":vs:", "🆚"},
                {":vibration_mode:", "📳"},
                {":mobile_phone_off:", "📴"},
                {":a:", "🅰️"},
                {":b:", "🅱️"},
                {":ab:", "🆎"},
                {":o2:", "🅾️"},
                {":diamond_shape_with_a_dot_inside:", "💠"},
                {":loop:", "➿"},
                {":recycle:", "♻️"},
                {":aries:", "♈"},
                {":taurus:", "♉"},
                {":gemini:", "♊"},
                {":cancer:", "♋"},
                {":leo:", "♌"},
                {":virgo:", "♍"},
                {":libra:", "♎"},
                {":scorpius:", "♏"},
                {":sagittarius:", "♐"},
                {":capricorn:", "♑"},
                {":aquarius:", "♒"},
                {":pisces:", "♓"},
                {":ophiuchus:", "⛎"},
                {":six_pointed_star:", "🔯"},
                {":atm:", "🏧"},
                {":chart:", "💹"},
                {":heavy_dollar_sign:", "💲"},
                {":currency_exchange:", "💱"},
                {":copyright:", "©️"},
                {":registered:", "®️"},
                {":tm:", "™️"},
                {":x:", "❌"},
                {":bangbang:", "‼️"},
                {":interrobang:", "⁉️"},
                {":exclamation:", "❗"},
                {":heavy_exclamation_mark:", "❗"},
                {":question:", "❓"},
                {":grey_exclamation:", "❕"},
                {":grey_question:", "❔"},
                {":o:", "⭕"},
                {":top:", "🔝"},
                {":end:", "🔚"},
                {":back:", "🔙"},
                {":on:", "🔛"},
                {":soon:", "🔜"},
                {":arrows_clockwise:", "🔃"},
                {":clock12:", "🕛"},
                {":clock1230:", "🕧"},
                {":clock1:", "🕐"},
                {":clock130:", "🕜"},
                {":clock2:", "🕑"},
                {":clock230:", "🕝"},
                {":clock3:", "🕒"},
                {":clock330:", "🕞"},
                {":clock4:", "🕓"},
                {":clock430:", "🕟"},
                {":clock5:", "🕔"},
                {":clock530:", "🕠"},
                {":clock6:", "🕕"},
                {":clock7:", "🕖"},
                {":clock8:", "🕗"},
                {":clock9:", "🕘"},
                {":clock10:", "🕙"},
                {":clock11:", "🕚"},
                {":clock630:", "🕡"},
                {":clock730:", "🕢"},
                {":clock830:", "🕣"},
                {":clock930:", "🕤"},
                {":clock1030:", "🕥"},
                {":clock1130:", "🕦"},
                {":heavy_multiplication_x:", "✖️"},
                {":heavy_plus_sign:", "➕"},
                {":heavy_minus_sign:", "➖"},
                {":heavy_division_sign:", "➗"},
                {":spades:", "♠️"},
                {":hearts:", "♥️"},
                {":clubs:", "♣️"},
                {":diamonds:", "♦️"},
                {":white_flower:", "💮"},
                {":heavy_check_mark:", "✔️"},
                {":ballot_box_with_check:", "☑️"},
                {":radio_button:", "🔘"},
                {":link:", "🔗"},
                {":curly_loop:", "➰"},
                {":wavy_dash:", "〰️"},
                {":part_alternation_mark:", "〽️"},
                {":trident:", "🔱"},
                {":black_medium_square:", "◼️"},
                {":white_medium_square:", "◻️"},
                {":black_medium_small_square:", "◾"},
                {":white_medium_small_square:", "◽"},
                {":black_small_square:", "▪️"},
                {":white_small_square:", "▫️"},
                {":small_red_triangle:", "🔺"},
                {":black_square_button:", "🔲"},
                {":white_square_button:", "🔳"},
                {":black_circle:", "⚫"},
                {":white_circle:", "⚪"},
                {":red_circle:", "🔴"},
                {":large_blue_circle:", "🔵"},
                {":small_red_triangle_down:", "🔻"},
                {":white_large_square:", "⬜"},
                {":black_large_square:", "⬛"},
                {":large_orange_diamond:", "🔶"},
                {":large_blue_diamond:", "🔷"},
                {":small_orange_diamond:", "🔸"},
                {":small_blue_diamond:", "🔹"},

                // Custom additions
                { ":custom_arrow_left:", "←"},
                { ":custom_arrow_right:", "→"},
                { ":custom_arrow_left_right:", "↔"},

                { ":custom_arrow_left_strong:", "⇐"},
                { ":custom_arrow_right_strong:", "⇒"},
                { ":custom_arrow_left_right_strong:", "⇔"},
                {":rofl:","🤣"},
                {":slightly_smiling_face:","🙂"},
                {":upside_down_face:","🙃"},
                {":star_struck:","🤩"},
                {":zany_face:","🤪"},
                {":money_mouth_face:","🤑"},
                {":hugs:","🤗"},
                {":hand_over_mouth:","🤭"},
                {":shushing_face:","🤫"},
                {":thinking:","🤔"},
                {":zipper_mouth_face:","🤐"},
                {":raised_eyebrow:","🤨"},
                {":roll_eyes:","🙄"},
                {":lying_face:","🤥"},
                {":drooling_face:","🤤"},
                {":face_with_thermometer:","🤒"},
                {":face_with_head_bandage:","🤕"},
                {":nauseated_face:","🤢"},
                {":vomiting_face:","🤮"},
                {":sneezing_face:","🤧"},
                {":exploding_head:","🤯"},
                {":cowboy_hat_face:","🤠"},
                {":nerd_face:","🤓"},
                {":monocle_face:","🧐"},
                {":slightly_frowning_face:","🙁"},
                {":frowning_face:","☹️"},
                {":cursing_face:","🤬"},
                {":skull_and_crossbones:","☠️"},
                {":clown_face:","🤡"},
                {":robot:","🤖"},
                {":heavy_heart_exclamation:","❣️"},
                {":orange_heart:","🧡"},
                {":black_heart:","🖤"},
                {":hole:","🕳️"},
                {":eye_speech_bubble:","👁️‍🗨️"},
                {":left_speech_bubble:","🗨️"},
                {":right_anger_bubble:","🗯️"},
                {":raised_back_of_hand:","🤚"},
                {":raised_hand_with_fingers_splayed:","🖐️"},
                {":vulcan_salute:","🖖"},
                {":crossed_fingers:","🤞"},
                {":love_you_gesture:","🤟"},
                {":metal:","🤘"},
                {":call_me_hand:","🤙"},
                {":middle_finger:","🖕"},
                {":fist_raised:","✊"},
                {":fist_oncoming:","👊"},
                {":fist_left:","🤛"},
                {":fist_right:","🤜"},
                {":palms_up_together:","🤲"},
                {":handshake:","🤝"},
                {":writing_hand:","✍️"},
                {":selfie:","🤳"},
                {":brain:","🧠"},
                {":eye:","👁️"},
                {":child:","🧒"},
                {":adult:","🧑"},
                {":blond_haired_person:","👱"},
                {":bearded_person:","🧔"},
                {":blond_haired_man:","👱‍♂️"},
                {":blond_haired_woman:","👱‍♀️"},
                {":older_adult:","🧓"},
                {":frowning_person:","🙍"},
                {":frowning_man:","🙍‍♂️"},
                {":frowning_woman:","🙍‍♀️"},
                {":pouting_face:","🙎"},
                {":pouting_man:","🙎‍♂️"},
                {":pouting_woman:","🙎‍♀️"},
                {":no_good_man:","🙅‍♂️"},
                {":no_good_woman:","🙅‍♀️"},
                {":ok_person:","🙆"},
                {":ok_man:","🙆‍♂️"},
                {":tipping_hand_person:","💁"},
                {":tipping_hand_man:","💁‍♂️"},
                {":tipping_hand_woman:","💁‍♀️"},
                {":raising_hand_man:","🙋‍♂️"},
                {":raising_hand_woman:","🙋‍♀️"},
                {":bowing_man:","🙇‍♂️"},
                {":bowing_woman:","🙇‍♀️"},
                {":facepalm:","🤦"},
                {":man_facepalming:","🤦‍♂️"},
                {":woman_facepalming:","🤦‍♀️"},
                {":shrug:","🤷"},
                {":man_shrugging:","🤷‍♂️"},
                {":woman_shrugging:","🤷‍♀️"},
                {":man_health_worker:","👨‍⚕️"},
                {":woman_health_worker:","👩‍⚕️"},
                {":man_student:","👨‍🎓"},
                {":woman_student:","👩‍🎓"},
                {":man_teacher:","👨‍🏫"},
                {":woman_teacher:","👩‍🏫"},
                {":man_judge:","👨‍⚖️"},
                {":woman_judge:","👩‍⚖️"},
                {":man_farmer:","👨‍🌾"},
                {":woman_farmer:","👩‍🌾"},
                {":man_cook:","👨‍🍳"},
                {":woman_cook:","👩‍🍳"},
                {":man_mechanic:","👨‍🔧"},
                {":woman_mechanic:","👩‍🔧"},
                {":man_factory_worker:","👨‍🏭"},
                {":woman_factory_worker:","👩‍🏭"},
                {":man_office_worker:","👨‍💼"},
                {":woman_office_worker:","👩‍💼"},
                {":man_scientist:","👨‍🔬"},
                {":woman_scientist:","👩‍🔬"},
                {":man_technologist:","👨‍💻"},
                {":woman_technologist:","👩‍💻"},
                {":man_singer:","👨‍🎤"},
                {":woman_singer:","👩‍🎤"},
                {":man_artist:","👨‍🎨"},
                {":woman_artist:","👩‍🎨"},
                {":man_pilot:","👨‍✈️"},
                {":woman_pilot:","👩‍✈️"},
                {":man_astronaut:","👨‍🚀"},
                {":woman_astronaut:","👩‍🚀"},
                {":man_firefighter:","👨‍🚒"},
                {":woman_firefighter:","👩‍🚒"},
                {":police_officer:","👮"},
                {":policeman:","👮‍♂️"},
                {":policewoman:","👮‍♀️"},
                {":detective:","🕵️"},
                {":male_detective:","🕵️‍♂️"},
                {":female_detective:","🕵️‍♀️"},
                {":guard:","💂"},
                {":guardswoman:","💂‍♀️"},
                {":construction_worker_man:","👷‍♂️"},
                {":construction_worker_woman:","👷‍♀️"},
                {":prince:","🤴"},
                {":person_with_turban:","👳"},
                {":woman_with_turban:","👳‍♀️"},
                {":woman_with_headscarf:","🧕"},
                {":man_in_tuxedo:","🤵"},
                {":pregnant_woman:","🤰"},
                {":breast_feeding:","🤱"},
                {":mrs_claus:","🤶"},
                {":mage:","🧙"},
                {":mage_man:","🧙‍♂️"},
                {":mage_woman:","🧙‍♀️"},
                {":fairy:","🧚"},
                {":fairy_man:","🧚‍♂️"},
                {":fairy_woman:","🧚‍♀️"},
                {":vampire:","🧛"},
                {":vampire_man:","🧛‍♂️"},
                {":vampire_woman:","🧛‍♀️"},
                {":merperson:","🧜"},
                {":merman:","🧜‍♂️"},
                {":mermaid:","🧜‍♀️"},
                {":elf:","🧝"},
                {":elf_man:","🧝‍♂️"},
                {":elf_woman:","🧝‍♀️"},
                {":genie:","🧞"},
                {":genie_man:","🧞‍♂️"},
                {":genie_woman:","🧞‍♀️"},
                {":zombie:","🧟"},
                {":zombie_man:","🧟‍♂️"},
                {":zombie_woman:","🧟‍♀️"},
                {":massage_man:","💆‍♂️"},
                {":massage_woman:","💆‍♀️"},
                {":haircut_man:","💇‍♂️"},
                {":haircut_woman:","💇‍♀️"},
                {":walking_man:","🚶‍♂️"},
                {":walking_woman:","🚶‍♀️"},
                {":running_man:","🏃‍♂️"},
                {":running_woman:","🏃‍♀️"},
                {":woman_dancing:","💃"},
                {":man_dancing:","🕺"},
                {":business_suit_levitating:","🕴️"},
                {":dancing_men:","👯‍♂️"},
                {":dancing_women:","👯‍♀️"},
                {":sauna_person:","🧖"},
                {":sauna_man:","🧖‍♂️"},
                {":sauna_woman:","🧖‍♀️"},
                {":climbing:","🧗"},
                {":climbing_man:","🧗‍♂️"},
                {":climbing_woman:","🧗‍♀️"},
                {":person_fencing:","🤺"},
                {":skier:","⛷️"},
                {":golfing:","🏌️"},
                {":golfing_man:","🏌️‍♂️"},
                {":golfing_woman:","🏌️‍♀️"},
                {":surfing_man:","🏄‍♂️"},
                {":surfing_woman:","🏄‍♀️"},
                {":rowing_man:","🚣‍♂️"},
                {":rowing_woman:","🚣‍♀️"},
                {":swimming_man:","🏊‍♂️"},
                {":swimming_woman:","🏊‍♀️"},
                {":bouncing_ball_person:","⛹️"},
                {":bouncing_ball_man:","⛹️‍♂️"},
                {":bouncing_ball_woman:","⛹️‍♀️"},
                {":weight_lifting:","🏋️"},
                {":weight_lifting_man:","🏋️‍♂️"},
                {":weight_lifting_woman:","🏋️‍♀️"},
                {":biking_man:","🚴‍♂️"},
                {":biking_woman:","🚴‍♀️"},
                {":mountain_biking_man:","🚵‍♂️"},
                {":mountain_biking_woman:","🚵‍♀️"},
                {":cartwheeling:","🤸"},
                {":man_cartwheeling:","🤸‍♂️"},
                {":woman_cartwheeling:","🤸‍♀️"},
                {":wrestling:","🤼"},
                {":men_wrestling:","🤼‍♂️"},
                {":women_wrestling:","🤼‍♀️"},
                {":water_polo:","🤽"},
                {":man_playing_water_polo:","🤽‍♂️"},
                {":woman_playing_water_polo:","🤽‍♀️"},
                {":handball_person:","🤾"},
                {":man_playing_handball:","🤾‍♂️"},
                {":woman_playing_handball:","🤾‍♀️"},
                {":juggling_person:","🤹"},
                {":man_juggling:","🤹‍♂️"},
                {":woman_juggling:","🤹‍♀️"},
                {":lotus_position:","🧘"},
                {":lotus_position_man:","🧘‍♂️"},
                {":lotus_position_woman:","🧘‍♀️"},
                {":sleeping_bed:","🛌"},
                {":people_holding_hands:","🧑‍🤝‍🧑"},
                {":couplekiss_man_woman:","👩‍❤️‍💋‍👨"},
                {":couplekiss_man_man:","👨‍❤️‍💋‍👨"},
                {":couplekiss_woman_woman:","👩‍❤️‍💋‍👩"},
                {":couple_with_heart_woman_man:","👩‍❤️‍👨"},
                {":couple_with_heart_man_man:","👨‍❤️‍👨"},
                {":couple_with_heart_woman_woman:","👩‍❤️‍👩"},
                {":family_man_woman_boy:","👨‍👩‍👦"},
                {":family_man_woman_girl:","👨‍👩‍👧"},
                {":family_man_woman_girl_boy:","👨‍👩‍👧‍👦"},
                {":family_man_woman_boy_boy:","👨‍👩‍👦‍👦"},
                {":family_man_woman_girl_girl:","👨‍👩‍👧‍👧"},
                {":family_man_man_boy:","👨‍👨‍👦"},
                {":family_man_man_girl:","👨‍👨‍👧"},
                {":family_man_man_girl_boy:","👨‍👨‍👧‍👦"},
                {":family_man_man_boy_boy:","👨‍👨‍👦‍👦"},
                {":family_man_man_girl_girl:","👨‍👨‍👧‍👧"},
                {":family_woman_woman_boy:","👩‍👩‍👦"},
                {":family_woman_woman_girl:","👩‍👩‍👧"},
                {":family_woman_woman_girl_boy:","👩‍👩‍👧‍👦"},
                {":family_woman_woman_boy_boy:","👩‍👩‍👦‍👦"},
                {":family_woman_woman_girl_girl:","👩‍👩‍👧‍👧"},
                {":family_man_boy:","👨‍👦"},
                {":family_man_boy_boy:","👨‍👦‍👦"},
                {":family_man_girl:","👨‍👧"},
                {":family_man_girl_boy:","👨‍👧‍👦"},
                {":family_man_girl_girl:","👨‍👧‍👧"},
                {":family_woman_boy:","👩‍👦"},
                {":family_woman_boy_boy:","👩‍👦‍👦"},
                {":family_woman_girl:","👩‍👧"},
                {":family_woman_girl_boy:","👩‍👧‍👦"},
                {":family_woman_girl_girl:","👩‍👧‍👧"},
                {":speaking_head:","🗣️"},
                {":gorilla:","🦍"},
                {":fox_face:","🦊"},
                {":lion:","🦁"},
                {":unicorn:","🦄"},
                {":zebra:","🦓"},
                {":deer:","🦌"},
                {":giraffe:","🦒"},
                {":rhinoceros:","🦏"},
                {":chipmunk:","🐿️"},
                {":hedgehog:","🦔"},
                {":bat:","🦇"},
                {":turkey:","🦃"},
                {":dove:","🕊️"},
                {":eagle:","🦅"},
                {":duck:","🦆"},
                {":owl:","🦉"},
                {":lizard:","🦎"},
                {":sauropod:","🦕"},
                {":t-rex:","🦖"},
                {":shark:","🦈"},
                {":butterfly:","🦋"},
                {":cricket:","🦗"},
                {":spider:","🕷️"},
                {":spider_web:","🕸️"},
                {":scorpion:","🦂"},
                {":rosette:","🏵️"},
                {":wilted_flower:","🥀"},
                {":shamrock:","☘️"},
                {":kiwi_fruit:","🥝"},
                {":coconut:","🥥"},
                {":avocado:","🥑"},
                {":potato:","🥔"},
                {":carrot:","🥕"},
                {":hot_pepper:","🌶️"},
                {":cucumber:","🥒"},
                {":broccoli:","🥦"},
                {":peanuts:","🥜"},
                {":croissant:","🥐"},
                {":baguette_bread:","🥖"},
                {":pretzel:","🥨"},
                {":pancakes:","🥞"},
                {":cheese:","🧀"},
                {":cut_of_meat:","🥩"},
                {":bacon:","🥓"},
                {":hotdog:","🌭"},
                {":sandwich:","🥪"},
                {":taco:","🌮"},
                {":burrito:","🌯"},
                {":stuffed_flatbread:","🥙"},
                {":fried_egg:","🍳"},
                {":shallow_pan_of_food:","🥘"},
                {":bowl_with_spoon:","🥣"},
                {":green_salad:","🥗"},
                {":popcorn:","🍿"},
                {":canned_food:","🥫"},
                {":dumpling:","🥟"},
                {":fortune_cookie:","🥠"},
                {":takeout_box:","🥡"},
                {":crab:","🦀"},
                {":shrimp:","🦐"},
                {":squid:","🦑"},
                {":pie:","🥧"},
                {":milk_glass:","🥛"},
                {":champagne:","🍾"},
                {":clinking_glasses:","🥂"},
                {":tumbler_glass:","🥃"},
                {":cup_with_straw:","🥤"},
                {":chopsticks:","🥢"},
                {":plate_with_cutlery:","🍽️"},
                {":spoon:","🥄"},
                {":amphora:","🏺"},
                {":world_map:","🗺️"},
                {":mountain_snow:","🏔️"},
                {":mountain:","⛰️"},
                {":camping:","🏕️"},
                {":beach_umbrella:","🏖️"},
                {":desert:","🏜️"},
                {":desert_island:","🏝️"},
                {":national_park:","🏞️"},
                {":stadium:","🏟️"},
                {":classical_building:","🏛️"},
                {":building_construction:","🏗️"},
                {":houses:","🏘️"},
                {":derelict_house:","🏚️"},
                {":mosque:","🕌"},
                {":synagogue:","🕍"},
                {":shinto_shrine:","⛩️"},
                {":kaaba:","🕋"},
                {":cityscape:","🏙️"},
                {":racing_car:","🏎️"},
                {":motorcycle:","🏍️"},
                {":motor_scooter:","🛵"},
                {":kick_scooter:","🛴"},
                {":motorway:","🛣️"},
                {":railway_track:","🛤️"},
                {":oil_drum:","🛢️"},
                {":stop_sign:","🛑"},
                {":canoe:","🛶"},
                {":passenger_ship:","🛳️"},
                {":ferry:","⛴️"},
                {":motor_boat:","🛥️"},
                {":small_airplane:","🛩️"},
                {":flight_departure:","🛫"},
                {":flight_arrival:","🛬"},
                {":artificial_satellite:","🛰️"},
                {":flying_saucer:","🛸"},
                {":bellhop_bell:","🛎️"},
                {":stopwatch:","⏱️"},
                {":timer_clock:","⏲️"},
                {":mantelpiece_clock:","🕰️"},
                {":thermometer:","🌡️"},
                {":cloud_with_lightning_and_rain:","⛈️"},
                {":sun_behind_small_cloud:","🌤️"},
                {":sun_behind_large_cloud:","🌥️"},
                {":sun_behind_rain_cloud:","🌦️"},
                {":cloud_with_rain:","🌧️"},
                {":cloud_with_snow:","🌨️"},
                {":cloud_with_lightning:","🌩️"},
                {":tornado:","🌪️"},
                {":fog:","🌫️"},
                {":wind_face:","🌬️"},
                {":open_umbrella:","☂️"},
                {":parasol_on_ground:","⛱️"},
                {":snowman_with_snow:","☃️"},
                {":comet:","☄️"},
                {":reminder_ribbon:","🎗️"},
                {":tickets:","🎟️"},
                {":medal_military:","🎖️"},
                {":medal_sports:","🏅"},
                {":1st_place_medal:","🥇"},
                {":2nd_place_medal:","🥈"},
                {":3rd_place_medal:","🥉"},
                {":volleyball:","🏐"},
                {":cricket_game:","🏏"},
                {":field_hockey:","🏑"},
                {":ice_hockey:","🏒"},
                {":ping_pong:","🏓"},
                {":badminton:","🏸"},
                {":boxing_glove:","🥊"},
                {":martial_arts_uniform:","🥋"},
                {":goal_net:","🥅"},
                {":ice_skate:","⛸️"},
                {":sled:","🛷"},
                {":curling_stone:","🥌"},
                {":joystick:","🕹️"},
                {":chess_pawn:","♟️"},
                {":framed_picture:","🖼️"},
                {":dark_sunglasses:","🕶️"},
                {":scarf:","🧣"},
                {":gloves:","🧤"},
                {":coat:","🧥"},
                {":socks:","🧦"},
                {":shopping:","🛍️"},
                {":billed_cap:","🧢"},
                {":rescue_worker_helmet:","⛑️"},
                {":prayer_beads:","📿"},
                {":studio_microphone:","🎙️"},
                {":level_slider:","🎚️"},
                {":control_knobs:","🎛️"},
                {":drum:","🥁"},
                {":desktop_computer:","🖥️"},
                {":printer:","🖨️"},
                {":keyboard:","⌨️"},
                {":computer_mouse:","🖱️"},
                {":trackball:","🖲️"},
                {":film_strip:","🎞️"},
                {":film_projector:","📽️"},
                {":camera_flash:","📸"},
                {":candle:","🕯️"},
                {":newspaper_roll:","🗞️"},
                {":label:","🏷️"},
                {":ballot_box:","🗳️"},
                {":fountain_pen:","🖋️"},
                {":pen:","🖊️"},
                {":paintbrush:","🖌️"},
                {":crayon:","🖍️"},
                {":card_index_dividers:","🗂️"},
                {":spiral_notepad:","🗒️"},
                {":spiral_calendar:","🗓️"},
                {":paperclips:","🖇️"},
                {":card_file_box:","🗃️"},
                {":file_cabinet:","🗄️"},
                {":wastebasket:","🗑️"},
                {":old_key:","🗝️"},
                {":pick:","⛏️"},
                {":hammer_and_pick:","⚒️"},
                {":hammer_and_wrench:","🛠️"},
                {":dagger:","🗡️"},
                {":crossed_swords:","⚔️"},
                {":bow_and_arrow:","🏹"},
                {":shield:","🛡️"},
                {":gear:","⚙️"},
                {":clamp:","🗜️"},
                {":balance_scale:","⚖️"},
                {":chains:","⛓️"},
                {":alembic:","⚗️"},
                {":bed:","🛏️"},
                {":couch_and_lamp:","🛋️"},
                {":shopping_cart:","🛒"},
                {":coffin:","⚰️"},
                {":funeral_urn:","⚱️"},
                {":radioactive:","☢️"},
                {":biohazard:","☣️"},
                {":place_of_worship:","🛐"},
                {":atom_symbol:","⚛️"},
                {":om:","🕉️"},
                {":star_of_david:","✡️"},
                {":wheel_of_dharma:","☸️"},
                {":yin_yang:","☯️"},
                {":latin_cross:","✝️"},
                {":orthodox_cross:","☦️"},
                {":star_and_crescent:","☪️"},
                {":peace_symbol:","☮️"},
                {":menorah:","🕎"},
                {":next_track_button:","⏭️"},
                {":play_or_pause_button:","⏯️"},
                {":previous_track_button:","⏮️"},
                {":pause_button:","⏸️"},
                {":stop_button:","⏹️"},
                {":record_button:","⏺️"},
                {":eject_button:","⏏️"},
                {":female_sign:","♀️"},
                {":male_sign:","♂️"},
                {":medical_symbol:","⚕️"},
                {":infinity:","♾️"},
                {":fleur_de_lis:","⚜️"},
                {":asterisk:","*️⃣"},
                {":black_flag:","🏴"},
                {":white_flag:","🏳️"},
                {":rainbow_flag:","🏳️‍🌈"},
                {":pirate_flag:","🏴‍☠️"},
                {":ascension_island:","🇦🇨"},
                {":andorra:","🇦🇩"},
                {":united_arab_emirates:","🇦🇪"},
                {":afghanistan:","🇦🇫"},
                {":antigua_barbuda:","🇦🇬"},
                {":anguilla:","🇦🇮"},
                {":albania:","🇦🇱"},
                {":armenia:","🇦🇲"},
                {":angola:","🇦🇴"},
                {":antarctica:","🇦🇶"},
                {":argentina:","🇦🇷"},
                {":american_samoa:","🇦🇸"},
                {":austria:","🇦🇹"},
                {":australia:","🇦🇺"},
                {":aruba:","🇦🇼"},
                {":aland_islands:","🇦🇽"},
                {":azerbaijan:","🇦🇿"},
                {":bosnia_herzegovina:","🇧🇦"},
                {":barbados:","🇧🇧"},
                {":bangladesh:","🇧🇩"},
                {":belgium:","🇧🇪"},
                {":burkina_faso:","🇧🇫"},
                {":bulgaria:","🇧🇬"},
                {":bahrain:","🇧🇭"},
                {":burundi:","🇧🇮"},
                {":benin:","🇧🇯"},
                {":st_barthelemy:","🇧🇱"},
                {":bermuda:","🇧🇲"},
                {":brunei:","🇧🇳"},
                {":bolivia:","🇧🇴"},
                {":caribbean_netherlands:","🇧🇶"},
                {":brazil:","🇧🇷"},
                {":bahamas:","🇧🇸"},
                {":bhutan:","🇧🇹"},
                {":bouvet_island:","🇧🇻"},
                {":botswana:","🇧🇼"},
                {":belarus:","🇧🇾"},
                {":belize:","🇧🇿"},
                {":canada:","🇨🇦"},
                {":cocos_islands:","🇨🇨"},
                {":congo_kinshasa:","🇨🇩"},
                {":central_african_republic:","🇨🇫"},
                {":congo_brazzaville:","🇨🇬"},
                {":switzerland:","🇨🇭"},
                {":cote_divoire:","🇨🇮"},
                {":cook_islands:","🇨🇰"},
                {":chile:","🇨🇱"},
                {":cameroon:","🇨🇲"},
                {":colombia:","🇨🇴"},
                {":clipperton_island:","🇨🇵"},
                {":costa_rica:","🇨🇷"},
                {":cuba:","🇨🇺"},
                {":cape_verde:","🇨🇻"},
                {":curacao:","🇨🇼"},
                {":christmas_island:","🇨🇽"},
                {":cyprus:","🇨🇾"},
                {":czech_republic:","🇨🇿"},
                {":diego_garcia:","🇩🇬"},
                {":djibouti:","🇩🇯"},
                {":denmark:","🇩🇰"},
                {":dominica:","🇩🇲"},
                {":dominican_republic:","🇩🇴"},
                {":algeria:","🇩🇿"},
                {":ceuta_melilla:","🇪🇦"},
                {":ecuador:","🇪🇨"},
                {":estonia:","🇪🇪"},
                {":egypt:","🇪🇬"},
                {":western_sahara:","🇪🇭"},
                {":eritrea:","🇪🇷"},
                {":ethiopia:","🇪🇹"},
                {":eu:","🇪🇺"},
                {":finland:","🇫🇮"},
                {":fiji:","🇫🇯"},
                {":falkland_islands:","🇫🇰"},
                {":micronesia:","🇫🇲"},
                {":faroe_islands:","🇫🇴"},
                {":gabon:","🇬🇦"},
                {":grenada:","🇬🇩"},
                {":georgia:","🇬🇪"},
                {":french_guiana:","🇬🇫"},
                {":guernsey:","🇬🇬"},
                {":ghana:","🇬🇭"},
                {":gibraltar:","🇬🇮"},
                {":greenland:","🇬🇱"},
                {":gambia:","🇬🇲"},
                {":guinea:","🇬🇳"},
                {":guadeloupe:","🇬🇵"},
                {":equatorial_guinea:","🇬🇶"},
                {":greece:","🇬🇷"},
                {":south_georgia_south_sandwich_islands:","🇬🇸"},
                {":guatemala:","🇬🇹"},
                {":guam:","🇬🇺"},
                {":guinea_bissau:","🇬🇼"},
                {":guyana:","🇬🇾"},
                {":hong_kong:","🇭🇰"},
                {":heard_mcdonald_islands:","🇭🇲"},
                {":honduras:","🇭🇳"},
                {":croatia:","🇭🇷"},
                {":haiti:","🇭🇹"},
                {":hungary:","🇭🇺"},
                {":canary_islands:","🇮🇨"},
                {":indonesia:","🇮🇩"},
                {":ireland:","🇮🇪"},
                {":israel:","🇮🇱"},
                {":isle_of_man:","🇮🇲"},
                {":india:","🇮🇳"},
                {":british_indian_ocean_territory:","🇮🇴"},
                {":iraq:","🇮🇶"},
                {":iran:","🇮🇷"},
                {":iceland:","🇮🇸"},
                {":jersey:","🇯🇪"},
                {":jamaica:","🇯🇲"},
                {":jordan:","🇯🇴"},
                {":kenya:","🇰🇪"},
                {":kyrgyzstan:","🇰🇬"},
                {":cambodia:","🇰🇭"},
                {":kiribati:","🇰🇮"},
                {":comoros:","🇰🇲"},
                {":st_kitts_nevis:","🇰🇳"},
                {":north_korea:","🇰🇵"},
                {":kuwait:","🇰🇼"},
                {":cayman_islands:","🇰🇾"},
                {":kazakhstan:","🇰🇿"},
                {":laos:","🇱🇦"},
                {":lebanon:","🇱🇧"},
                {":st_lucia:","🇱🇨"},
                {":liechtenstein:","🇱🇮"},
                {":sri_lanka:","🇱🇰"},
                {":liberia:","🇱🇷"},
                {":lesotho:","🇱🇸"},
                {":lithuania:","🇱🇹"},
                {":luxembourg:","🇱🇺"},
                {":latvia:","🇱🇻"},
                {":libya:","🇱🇾"},
                {":morocco:","🇲🇦"},
                {":monaco:","🇲🇨"},
                {":moldova:","🇲🇩"},
                {":montenegro:","🇲🇪"},
                {":st_martin:","🇲🇫"},
                {":madagascar:","🇲🇬"},
                {":marshall_islands:","🇲🇭"},
                {":macedonia:","🇲🇰"},
                {":mali:","🇲🇱"},
                {":myanmar:","🇲🇲"},
                {":mongolia:","🇲🇳"},
                {":macau:","🇲🇴"},
                {":northern_mariana_islands:","🇲🇵"},
                {":martinique:","🇲🇶"},
                {":mauritania:","🇲🇷"},
                {":montserrat:","🇲🇸"},
                {":malta:","🇲🇹"},
                {":mauritius:","🇲🇺"},
                {":maldives:","🇲🇻"},
                {":malawi:","🇲🇼"},
                {":mexico:","🇲🇽"},
                {":malaysia:","🇲🇾"},
                {":mozambique:","🇲🇿"},
                {":namibia:","🇳🇦"},
                {":new_caledonia:","🇳🇨"},
                {":niger:","🇳🇪"},
                {":norfolk_island:","🇳🇫"},
                {":nigeria:","🇳🇬"},
                {":nicaragua:","🇳🇮"},
                {":netherlands:","🇳🇱"},
                {":norway:","🇳🇴"},
                {":nepal:","🇳🇵"},
                {":nauru:","🇳🇷"},
                {":niue:","🇳🇺"},
                {":new_zealand:","🇳🇿"},
                {":oman:","🇴🇲"},
                {":panama:","🇵🇦"},
                {":peru:","🇵🇪"},
                {":french_polynesia:","🇵🇫"},
                {":papua_new_guinea:","🇵🇬"},
                {":philippines:","🇵🇭"},
                {":pakistan:","🇵🇰"},
                {":poland:","🇵🇱"},
                {":st_pierre_miquelon:","🇵🇲"},
                {":pitcairn_islands:","🇵🇳"},
                {":puerto_rico:","🇵🇷"},
                {":palestinian_territories:","🇵🇸"},
                {":portugal:","🇵🇹"},
                {":palau:","🇵🇼"},
                {":paraguay:","🇵🇾"},
                {":qatar:","🇶🇦"},
                {":reunion:","🇷🇪"},
                {":romania:","🇷🇴"},
                {":serbia:","🇷🇸"},
                {":rwanda:","🇷🇼"},
                {":saudi_arabia:","🇸🇦"},
                {":solomon_islands:","🇸🇧"},
                {":seychelles:","🇸🇨"},
                {":sudan:","🇸🇩"},
                {":sweden:","🇸🇪"},
                {":singapore:","🇸🇬"},
                {":st_helena:","🇸🇭"},
                {":slovenia:","🇸🇮"},
                {":svalbard_jan_mayen:","🇸🇯"},
                {":slovakia:","🇸🇰"},
                {":sierra_leone:","🇸🇱"},
                {":san_marino:","🇸🇲"},
                {":senegal:","🇸🇳"},
                {":somalia:","🇸🇴"},
                {":suriname:","🇸🇷"},
                {":south_sudan:","🇸🇸"},
                {":sao_tome_principe:","🇸🇹"},
                {":el_salvador:","🇸🇻"},
                {":sint_maarten:","🇸🇽"},
                {":syria:","🇸🇾"},
                {":swaziland:","🇸🇿"},
                {":tristan_da_cunha:","🇹🇦"},
                {":turks_caicos_islands:","🇹🇨"},
                {":chad:","🇹🇩"},
                {":french_southern_territories:","🇹🇫"},
                {":togo:","🇹🇬"},
                {":thailand:","🇹🇭"},
                {":tajikistan:","🇹🇯"},
                {":tokelau:","🇹🇰"},
                {":timor_leste:","🇹🇱"},
                {":turkmenistan:","🇹🇲"},
                {":tunisia:","🇹🇳"},
                {":tonga:","🇹🇴"},
                {":tr:","🇹🇷"},
                {":trinidad_tobago:","🇹🇹"},
                {":tuvalu:","🇹🇻"},
                {":taiwan:","🇹🇼"},
                {":tanzania:","🇹🇿"},
                {":ukraine:","🇺🇦"},
                {":uganda:","🇺🇬"},
                {":us_outlying_islands:","🇺🇲"},
                {":united_nations:","🇺🇳"},
                {":uruguay:","🇺🇾"},
                {":uzbekistan:","🇺🇿"},
                {":vatican_city:","🇻🇦"},
                {":st_vincent_grenadines:","🇻🇨"},
                {":venezuela:","🇻🇪"},
                {":british_virgin_islands:","🇻🇬"},
                {":us_virgin_islands:","🇻🇮"},
                {":vietnam:","🇻🇳"},
                {":vanuatu:","🇻🇺"},
                {":wallis_futuna:","🇼🇫"},
                {":samoa:","🇼🇸"},
                {":kosovo:","🇽🇰"},
                {":yemen:","🇾🇪"},
                {":mayotte:","🇾🇹"},
                {":south_africa:","🇿🇦"},
                {":zambia:","🇿🇲"},
                {":zimbabwe:","🇿🇼"}
            };
        }

        /// <summary>
        /// Gets a new instance of the default smiley to emoji shortcode dictionary.
        /// It can be used to create a customized <see cref="EmojiMapping"/>.
        /// </summary>
        public static IDictionary<string, string> GetDefaultSmileyToEmojiShortcode()
        {
            return new Dictionary<string, string>(71)
            {
                {">:(", ":angry:"},
                {">:-(", ":angry:"},
                {":\")", ":blush:"},
                {":-\")", ":blush:"},
                {"</3", ":broken_heart:"},
                {"<\\3", ":broken_heart:"},
                {":/", ":confused:"},
                {":-/", ":confused:"},
                {":'(", ":cry:"},
                {":'-(", ":cry:"},
                {":,(", ":cry:"},
                {":,-(", ":cry:"},
                {":(", ":frowning:"},
                {":-(", ":frowning:"},
                {"<3", ":heart:"},
                {"]:(", ":imp:"},
                {"]:-(", ":imp:"},
                {"o:)", ":innocent:"},
                {"O:)", ":innocent:"},
                {"o:-)", ":innocent:"},
                {"O:-)", ":innocent:"},
                {"0:)", ":innocent:"},
                {"0:-)", ":innocent:"},
                {":')", ":joy:"},
                {":'-)", ":joy:"},
                {":,)", ":joy:"},
                {":,-)", ":joy:"},
                {":'D", ":joy:"},
                {":'-D", ":joy:"},
                {":,D", ":joy:"},
                {":,-D", ":joy:"},
                {":*", ":kissing:"},
                {":-* ", ":kissing:"},
                {"x-)", ":laughing:"},
                {"X-) ", ":laughing:"},
                {":|", ":neutral_face:"},
                {":-| ", ":neutral_face:"},
                {":o", ":open_mouth:"},
                {":-o", ":open_mouth:"},
                {":O", ":open_mouth:"},
                {":-O", ":open_mouth:"},
                {":@", ":rage:"},
                {":-@", ":rage:"},
                {":D", ":smile:"},
                {":-D", ":smile:"},
                {":)", ":smiley:"},
                {":-)", ":smiley:"},
                {"]:)", ":smiling_imp:"},
                {"]:-)", ":smiling_imp:"},
                {":,'(", ":sob:"},
                {":,'-(", ":sob:"},
                {";(", ":sob:"},
                {";-(", ":sob:"},
                {":P", ":stuck_out_tongue:"},
                {":-P", ":stuck_out_tongue:"},
                {"8-)", ":sunglasses:"},
                {"B-)", ":sunglasses:"},
                {":s", ":unamused:"},
                {":-S", ":unamused:"},
                {":z", ":unamused:"},
                {":-Z", ":unamused:"},
                {":$", ":unamused:"},
                {":-$", ":unamused:"},
                {";)", ":wink:"},
                {";-)", ":wink:"},

                // Custom arrows
                {"<-", ":custom_arrow_left:" },
                {"->", ":custom_arrow_right:" },
                {"<->", ":custom_arrow_left_right:" },

                {"<=", ":custom_arrow_left_strong:" },
                {"=>", ":custom_arrow_right_strong:" },
                {"<=>", ":custom_arrow_left_right_strong:" },
            };
        }

        #endregion

        /// <summary>
        /// Constructs a mapping for the default emoji shortcodes and smileys.
        /// </summary>
        public EmojiMapping(bool enableSmileys = true)
            : this(GetDefaultEmojiShortcodeToUnicode(),
                  enableSmileys ? GetDefaultSmileyToEmojiShortcode() : new Dictionary<string, string>())
        { }

        /// <summary>
        /// Constructs a mapping from a dictionary of emoji shortcodes to unicode, and a dictionary of smileys to emoji shortcodes.
        /// </summary>
        public EmojiMapping(IDictionary<string, string> shortcodeToUnicode, IDictionary<string, string> smileyToShortcode)
        {
            if (shortcodeToUnicode is null)
                ThrowHelper.ArgumentNullException(nameof(shortcodeToUnicode));

            if (smileyToShortcode is null)
                ThrowHelper.ArgumentNullException(nameof(smileyToShortcode));

            // Build emojis and smileys CompactPrefixTree

            int jointCount = shortcodeToUnicode.Count + smileyToShortcode.Count;

            // Count * 2 seems to be a good fit for the data set
            PrefixTree = new CompactPrefixTree<string>(jointCount, jointCount * 2, jointCount * 2);

            // This is not the best data set for the prefix tree as it will have to check the first character linearly
            // A work-around would require a bunch of substrings / removing the leading ':' from emojis, neither one is pretty
            // This way we sacrifice a few microseconds for not introducing breaking changes, emojis aren't all that common anyhow

            var firstChars = new HashSet<char>();

            foreach (var shortcode in shortcodeToUnicode)
            {
                if (string.IsNullOrEmpty(shortcode.Key) || string.IsNullOrEmpty(shortcode.Value))
                    ThrowHelper.ArgumentException("The dictionaries cannot contain null or empty keys/values", nameof(shortcodeToUnicode));

                firstChars.Add(shortcode.Key[0]);
                PrefixTree.Add(shortcode);
            }

            foreach (var smiley in smileyToShortcode)
            {
                if (string.IsNullOrEmpty(smiley.Key) || string.IsNullOrEmpty(smiley.Value))
                    ThrowHelper.ArgumentException("The dictionaries cannot contain null or empty keys/values", nameof(smileyToShortcode));

                if (!shortcodeToUnicode.TryGetValue(smiley.Value, out string? unicode))
                    ThrowHelper.ArgumentException(string.Format("Invalid smiley target: {0} is not present in the emoji shortcodes dictionary", smiley.Value));

                firstChars.Add(smiley.Key[0]);

                if (!PrefixTree.TryAdd(smiley.Key, unicode))
                    ThrowHelper.ArgumentException(string.Format("Smiley {0} is already present in the emoji mapping", smiley.Key));
            }

            OpeningCharacters = new List<char>(firstChars).ToArray();
        }
    }
}